class Validator {
  /**
   * 通用校验方法
   * @param {string} value - 待校验的值
   * @param {Object} rule - 校验规则
   * @param {boolean} [rule.required] - 是否必填
   * @param {number} [rule.minLength] - 最小长度
   * @param {number} [rule.maxLength] - 最大长度
   * @param {RegExp} [rule.pattern] - 正则表达式
   * @param {string} [rule.message] - 错误提示信息
   * @returns {Object} 校验结果 {isValid: boolean, message: string}
   */
  static validateCommon(value, rule) {
    const trimmedValue = value.trim();
    // 如果值为空，直接判定为有效
    if (!trimmedValue) {
      return { isValid: true, message: '' };
    }

    if (rule.minLength !== undefined && trimmedValue.length < rule.minLength) {
      return { isValid: false, message: rule.message || `至少需要 ${rule.minLength} 个字符` };
    }

    if (rule.maxLength !== undefined && trimmedValue.length > rule.maxLength) {
      return { isValid: false, message: rule.message || `不能超过 ${rule.maxLength} 个字符` };
    }

    if (rule.pattern && !rule.pattern.test(trimmedValue)) {
      return { isValid: false, message: rule.message || '格式不正确' };
    }

    return { isValid: true, message: '' };
  }

  /**
   * 用户名校验规则
   * @param {string} value - 用户名
   * @returns {Object} 校验结果
   */
  static validateUsername(value) {
    const rule = {
      minLength: 2,
      maxLength: 20,
      // 只允许中文、英文、数字和下划线
      pattern: /^[\u4e00-\u9fa5a-zA-Z0-9_]+$/,
      message: '用户名只能包含中文、英文、数字和下划线，长度为 2 - 20 个字符'
    };
    return this.validateCommon(value, rule);
  }

  /**
   * 微信ID校验规则
   * @param {string} value - 微信ID
   * @returns {Object} 校验结果
   */
  static validateWechatId(value) {
    const rule = {
      minLength: 6,
      maxLength: 20,
      // 微信ID只能是字母、数字、下划线和减号，且不能以下划线开头
      pattern: /^[a-zA-Z][a-zA-Z0-9_-]*$/,
      message: '微信ID格式不正确，只能包含字母、数字、下划线和减号，且必须以字母开头，长度为 6 - 20 个字符'
    };
    return this.validateCommon(value, rule);
  }

  /**
   * QQ号校验规则
   * @param {string} value - QQ号
   * @returns {Object} 校验结果
   */
  static validateQqId(value) {
    const rule = {
      // QQ号必须是5-11位数字，且不能以0开头
      pattern: /^[1-9][0-9]{4,10}$/,
      message: 'QQ号格式不正确，应为5-11位数字且不能以0开头'
    };
    return this.validateCommon(value, rule);
  }
}

export { Validator };